package cn.iocoder.yudao.module.mqtt.service.systemconfig;

import cn.hutool.core.collection.CollUtil;
import cn.iocoder.yudao.module.mqtt.dal.redis.RedisKeyConstants;
import lombok.val;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
import jakarta.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import org.springframework.transaction.annotation.Transactional;

import java.util.*;
import cn.iocoder.yudao.module.mqtt.controller.admin.systemconfig.vo.*;
import cn.iocoder.yudao.module.mqtt.dal.dataobject.systemconfig.SystemConfigDO;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;

import cn.iocoder.yudao.module.mqtt.dal.mysql.systemconfig.SystemConfigMapper;

import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.diffList;
import static cn.iocoder.yudao.module.mqtt.enums.ErrorCodeConstants.*;

/**
 * MQTT系统配置 Service 实现类
 *
 * @author 管理员
 */
@Service
@Validated
public class SystemConfigServiceImpl implements SystemConfigService {

    @Resource
    private SystemConfigMapper systemConfigMapper;

    @Override
    public Long createSystemConfig(SystemConfigSaveReqVO createReqVO) {
        // 插入
        SystemConfigDO systemConfig = BeanUtils.toBean(createReqVO, SystemConfigDO.class);
        systemConfigMapper.insert(systemConfig);
        // 返回
        return systemConfig.getId();
    }

    @Override
    public void updateSystemConfig(SystemConfigSaveReqVO updateReqVO) {
        // 校验存在
        validateSystemConfigExists(updateReqVO.getId());
        // 更新
        SystemConfigDO updateObj = BeanUtils.toBean(updateReqVO, SystemConfigDO.class);
        systemConfigMapper.updateById(updateObj);
    }

    @Override
    public void deleteSystemConfig(Long id) {
        // 校验存在
        validateSystemConfigExists(id);
        // 删除
        systemConfigMapper.deleteById(id);
    }

    @Override
        public void deleteSystemConfigListByIds(List<Long> ids) {
        // 校验存在
        validateSystemConfigExists(ids);
        // 删除
        systemConfigMapper.deleteByIds(ids);
        }

    private void validateSystemConfigExists(List<Long> ids) {
        List<SystemConfigDO> list = systemConfigMapper.selectByIds(ids);
        if (CollUtil.isEmpty(list) || list.size() != ids.size()) {
            throw exception(SYSTEM_CONFIG_NOT_EXISTS);
        }
    }

    private void validateSystemConfigExists(Long id) {
        if (systemConfigMapper.selectById(id) == null) {
            throw exception(SYSTEM_CONFIG_NOT_EXISTS);
        }
    }

    @Override
    public SystemConfigDO getSystemConfig(Long id) {
        return systemConfigMapper.selectById(id);
    }

    @Override
    public PageResult<SystemConfigDO> getSystemConfigPage(SystemConfigPageReqVO pageReqVO) {
        return systemConfigMapper.selectPage(pageReqVO);
    }


    @Override
    public List<SystemConfigDO> selectList(SystemConfigDO ddo) {
        return systemConfigMapper.selectList(ddo);
    }

    @Cacheable(value = RedisKeyConstants.MQTT_SYSTEM_KEY, key = "#sysKey")
    @Override
    public SystemConfigDO getValue(String sysKey) {
        return  systemConfigMapper.selectOne("sys_key", sysKey);
    }

}